From dfc7e02e7ab3715f098e8a6c4105016b0862c5df Mon Sep 17 00:00:00 2001 From: "cl349@firebug.cl.cam.ac.uk" Date: Tue, 26 Jul 2005 15:24:28 +0000 Subject: [PATCH] Fix bug where transaction fires multiple events. Add general trace() call to help future debugging. Signed-off-by: Rusty Russel Signed-off-by: Christian Limpach --- tools/xenstore/testsuite/08transaction.sh | 12 ++++++++++++ tools/xenstore/xenstored_core.c | 17 +++++++++++++++++ tools/xenstore/xenstored_core.h | 1 + tools/xenstore/xenstored_watch.c | 2 -- 4 files changed, 30 insertions(+), 2 deletions(-) diff --git a/tools/xenstore/testsuite/08transaction.sh b/tools/xenstore/testsuite/08transaction.sh index 4c786df687..20cd36f623 100644 --- a/tools/xenstore/testsuite/08transaction.sh +++ b/tools/xenstore/testsuite/08transaction.sh @@ -79,3 +79,15 @@ FATAL: 1: commit: Connection timed out" ] 2 async commit 1 waitwatch 1 ackwatch token' | ./xs_test 2>&1`" = "1:/test/dir/sub:token" ] + +# Multiple events from single transaction don't trigger assert +[ "`echo -e '1 watch /test token +2 start /test +2 write /test/1 create contents +2 write /test/2 create contents +2 async commit +1 waitwatch +1 ackwatch token +1 waitwatch +1 ackwatch token' | ./xs_test 2>&1`" = "1:/test/1:token +1:/test/2:token" ] diff --git a/tools/xenstore/xenstored_core.c b/tools/xenstore/xenstored_core.c index 3689ea4b56..3bf63314b7 100644 --- a/tools/xenstore/xenstored_core.c +++ b/tools/xenstore/xenstored_core.c @@ -111,6 +111,8 @@ void __attribute__((noreturn)) corrupt(struct connection *conn, str = talloc_vasprintf(NULL, fmt, arglist); va_end(arglist); + trace("xenstored corruption: connection id %i: err %s: %s", + conn ? (int)conn->id : -1, strerror(saved_errno), str); eprintf("xenstored corruption: connection id %i: err %s: %s", conn ? (int)conn->id : -1, strerror(saved_errno), str); #ifdef TESTING @@ -230,6 +232,21 @@ static void trace_blocked(const struct connection *conn, write(tracefd, ")\n", 2); } +void trace(const char *fmt, ...) +{ + va_list arglist; + char *str; + + if (tracefd < 0) + return; + + va_start(arglist, fmt); + str = talloc_vasprintf(NULL, fmt, arglist); + va_end(arglist); + write(tracefd, str, strlen(str)); + talloc_free(str); +} + static bool write_message(struct connection *conn) { int ret; diff --git a/tools/xenstore/xenstored_core.h b/tools/xenstore/xenstored_core.h index 61d47b5342..9643d36b95 100644 --- a/tools/xenstore/xenstored_core.h +++ b/tools/xenstore/xenstored_core.h @@ -170,5 +170,6 @@ void *read_all(int *fd, unsigned int *size); void trace_create(const void *data, const char *type); void trace_destroy(const void *data, const char *type); void trace_watch_timeout(const struct connection *conn, const char *node, const char *token); +void trace(const char *fmt, ...); #endif /* _XENSTORED_CORE_H */ diff --git a/tools/xenstore/xenstored_watch.c b/tools/xenstore/xenstored_watch.c index c532da26a8..a49dcbc954 100644 --- a/tools/xenstore/xenstored_watch.c +++ b/tools/xenstore/xenstored_watch.c @@ -134,8 +134,6 @@ bool fire_watches(struct connection *conn, const char *node, bool recurse) if (conn->transaction) return false; - assert(conn->state == OK); - /* Create an event for each watch. Don't send to self. */ list_for_each_entry(i, &connections, list) { if (i == conn) -- 2.30.2